package Day_0222.Spring;

/**
 * @author zxc
 * @date 2023/02/22 15:12
 **/
public class Spring_Dependency_Injection {
    public static void main(String[] args) {
        /**
         * 谈一谈对于依赖注入的理解
         * ===》
         * 1.控制反转IoC是一个很大的概念，可以用不同的方式来实现。其
         * 主要实现方式有两种：
         * ===》
         * 依赖注入（Dependency Injection） && 依赖查找
         *
         * 2.依赖注入：
         * ===》
         * 相对于IoC而言，依赖注入(DI)更加准确地描述了IoC的设计理念。
         * 所谓依赖注入（Dependency Injection），即组件之间的依赖关系由容器在应用系统运行期来决定，
         * 也就是，由容器动态地将某种依赖关系的目标对象实例 注入到应用系统中的各个关联的组件之中。
         * 组件不做定位查询，只提供普通的Java方法，让容器去决定依赖关系。
         *
         * 1）依赖注入的基本原则
         * （1）依赖注入的基本原则 ：应用组件不应该负责查找 资源或者其他依赖的协作对象。
         * （2）配置对象工作，应该由IoC容器负责，“查找资源”的逻辑应该从应用组件的代码中抽取出来，交给IoC容器负责。
         * （3）容器全权负责组件的装配，它会把符合依赖关系的对象通过属性（JavaBean中的setter）或者是构造器传递给需要的对象。
         *
         * 2）依赖注入有什么优势
         * （1）依赖注入，让容器全权负责依赖查询，
         *  组件只需要暴露JavaBean的 setter方法/带参数的构造器或者接口;
         *  ===》使得容器可以在初始化时，组装对象之间的依赖关系。
         *
         * （2）其与 依赖查找方式相比，主要优势为：
         *  查找定位操作与应用代码完全无关。（由IOC容器来管理对象之间的依赖关系 && 完成对象之间依赖关系的组装）
         *  不依赖于容器的API，可以很容易地在任何容器以外使用应用对象。
         *  不需要特殊的接口，绝大多数对象可以做到完全不必依赖容器。
         *
         *  3）不同类型的依赖注入实现方式
         * 依赖注入是时下最流行的IoC实现方式，
         * （1）依赖注入的分类 ：
         *  接口注入（Interface Injection），Setter方法注入（Setter Injection）和构造器注入（Constructor Injection）。
         *
         * （2）构造器依赖注入：
         *  构造器依赖注入，通过容器触发一个类的构造器来实现的，该类有一系列参数，每个参数代表一个对其他类的依赖。
         *
         * （3）Setter方法注入：
         *  Setter方法注入，容器通过调用无参构造器或无参static工厂方法 实例化bean之后，调用该bean的setter方法，
         *  即实现了基于setter的依赖注入。
         *
         * 4）构造器依赖注入 && Setter依赖注入之间的区别
         * （1）构造函数注入是完全注入,而Setter依赖注入是部分注入;
         * （2）构造函数注入会去覆盖Setter方法,而Setter依赖注入会覆盖Setter方法;
         * （3）构造函数注入中，任意修改都会导致创建新实例;
         *  而Setter依赖注入，由于是先通过类的无参构造方法构造出实例对象后，再调用Setter方法来实现依赖注入的，
         *  所以任意修改使得再次调用Setter方法，去实现依赖注入;
         * （4）构造函数依赖注入，适用于设置多个属性; 而Setter依赖注入，只适用于设置少量属性;
         *
         * 4）
         * 两种依赖方式都可以使用，构造器注入和Setter方法注入。
         * 最好的解决方案是用构造器参数实现强制依赖，setter方法实现可选依赖。
         *
         */
    }
}
